import {ValueDefine, VJson} from "../types";
import {applyValue, deepTraverObject, isReact} from "..";
import _ from 'lodash'

/**
 * 将所有的 this.$watch(()=>).$then(()=>{}) 转换为可观测，可查询的请求
 */
export function watchTransform(this: any, vjson: VJson): Promise<VJson> {
    const me = this

    return new Promise((resolve, reject) => {

        const valueDefineList: { path: string, value: ValueDefine<any> }[] = []

        deepTraverObject(vjson, (path, key, value) => {
            // 解析所有 vjson 中的 ValueDefine 接口
            if (value && value.isValueDefine === true) {
                valueDefineList.push({path, value})
            }

            // 如果值是 React 对象，就要将 React 变换为 ()=>value 类型
            if (isReact(value)) {
                _.set(vjson, path, () => value)
            }
        })

        // 将 ValueDefine 接口转换为 Promise.all 统一请求
        // 控件 vjson 中增加一段 watchOwner , 控件 mount 之后将自己的实例安装进去
        const promiseList = valueDefineList.map(({path, value}) => {
            value.start({
                scope: me,
                propertyName: path
            })
            return applyValue(value.get())
        })
        Promise.all(promiseList).then(resList => {
            for (let i = 0; i < resList.length; i++) {
                // 直接将 Promise 回调结果写入 vjson
                _.set(vjson, valueDefineList[i].path, resList[i])
            }

            resolve(vjson)
        })

    })
}